--[[
自写延时循环函数（luatOS功能不足） by wxz
@api basic.waitloop(sti_func,arg1,exp_func,arg2,sec)
@function sti_func,exp_func  响应事件函数和超时反应函数
@table arg1,arg2 两个函数传入的参数表
@number sec    等待响应秒数(目前仅支持小于60)
@return bool   成功返回true
@usage
aht10.init(0)
]]
local sti_func1_list={}
local arg1_list={}
local exp_func_list={}
local arg2_list={}
local t1_list={}
local sec_list={}
local list_length=0
local lock=false
local destroy=false  --是否正在销毁计时任务

function addwaitloop(sti_func,arg1,exp_func,arg2,sec)
    while destroy==true do  --等待销毁完成
    end
    lock=true
    local t1=rtc.get()
    log.info("basic.timerStart",t1["sec"])
    --log.info("test01")
    list_length=list_length+1
    table.insert(sti_func1_list,list_length,sti_func)
    table.insert(arg1_list,list_length,arg1)
    table.insert(exp_func_list,list_length,exp_func)
    table.insert(arg2_list,list_length,arg2)
    table.insert(t1_list,list_length,t1)
    table.insert(sec_list,list_length,sec)
    lock=false
    --log.info("test02")
end

function waitloopmoudle()
    while 1 do
        log.info("waitloopmoudle_test!")
        lcd.drawStr(20,10,notif)
        local t2 = rtc.get()
        for i=1,list_length do
            --log.info("test2")
            if lock then
                break
            end
            if sec_list[i]==nil then
                goto continue1
            end
            --log.info("test3")
            destroy=sti_func1_list[i](arg1_list[i])  --返回true表示定时器完成任务需要销毁
            if (t2["sec"]>t1_list[i]["sec"]+sec_list[i]) or ((t2["min"]>t1_list[i]["min"]) and (t2["sec"]+60>t1_list[i]["sec"]+sec_list[i])) then
                exp_func_list[i](arg2_list[i])  --?是否创建新线程更好
                destroy=true
            end
            if destroy then
                --log.info("basic.destroy","yes!",i,list_length)
                table.remove(sti_func1_list,i)
                table.remove(arg1_list,i)
                table.remove(exp_func_list,i)
                table.remove(arg2_list,i)
                table.remove(t1_list,i)
                table.remove(sec_list,i)
                list_length=list_length-1
                --log.info("basic.destroy","yes!",i,list_length)
                destroy=false
            end
            if list_length<=0 then
                --log.info("basic.exit","yes!",list_length)
                return
            end
            ::continue1::
        end        
        sys.wait(500)
    end
end